#-*- coding: UTF-8 -*-
from pyramid.httpexceptions import HTTPFound
from pyramid.security import remember
from pyramid.security import forget




from scp.modelo.models import DBSession
from scp.modelo.Usuario import Usuario
from scp.modelo.Permiso import Permiso
from scp.modelo.Proyecto import Proyecto
from scp.modelo.Rol import Rol
from scp.modelo.AsignacionRecurso import AsignacionRecurso
from scp.modelo.Recurso import Recurso
from scp.modelo.Fase import Fase


from pyramid.response import Response
from pyramid.view import view_config
import json

from pyramid.security import authenticated_userid

import re

#@view_config(renderer='json')
def autorizacion(request):
	"""Método controlador encargado de gestionar la autorizacion de funcionalidades de usuarios.
		URL asociada: /autorizacion/{operacion}
		operacion:
			
		@param request: Petición Http del cliente. 	
	"""	
	methodRequest = request.method
	dicParametros = request.matchdict
	
	session = DBSession()
	if dicParametros.get('operacion') == 'admUsuarios':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		recursoSistema = session.query(Recurso).filter_by(tipo='S').first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		for asigIter in asignacionesSistema:											
			for permisoIter in asigIter.rol.permisos:
				autorizacionesJson[permisoIter.nombre] = False		
			
		response = Response()
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return response
	
	if dicParametros.get('operacion') == 'desarrolloItems':
		
		print 'estoy en autorizaciones desarrollo de Items'
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		faseID = request.params['idFase']
		fase = session.query(Fase).filter_by( id = faseID).one()
		proyecto = session.query(Proyecto).filter_by( id = fase.proyecto_id).one()
		
		#traemos el recurso
		recurso = session.query(Recurso).filter_by( fase_id = faseID, tipo = 'F' ).one()
		
		asignacionesRecurso = session.query(AsignacionRecurso).filter_by( recurso_id = recurso.id, usuario_id = usuarioLogeado.id ).all()
		
		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		if proyecto.estado == 'ACTIVO':
			for asignacion in asignacionesRecurso:
				rolAsigncion = asignacion.rol											
				for permisoIter in rolAsigncion.permisos:
					autorizacionesJson[permisoIter.nombre] = False		
		elif proyecto.estado == 'FINALIZADO' or proyecto.estado == 'ANULADO':
			for asignacion in asignacionesRecurso:
				rolAsigncion = asignacion.rol											
				for permisoIter in rolAsigncion.permisos:
					if permisoIter.nombre == 'VER_ITEM' or permisoIter.nombre ==  'VER_IMPACTO_ITEM':
						autorizacionesJson[permisoIter.nombre] = False
			
			#autorizacionesJson['VER_ITEM'] = False	
			#autorizacionesJson['VER_IMPACTO_ITEM'] = False
					
		response = Response()
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		return response		
	
	if dicParametros.get('operacion') == 'admRoles':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		recursoSistema = session.query(Recurso).filter_by(tipo='S').first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		for asigIter in asignacionesSistema:											
			for permisoIter in asigIter.rol.permisos:
				autorizacionesJson[permisoIter.nombre] = False		
			
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return response
		
	if dicParametros.get('operacion') == 'admProyectos':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		recursoSistema = session.query(Recurso).filter_by(tipo='S').first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		for asigIter in asignacionesSistema:											
			for permisoIter in asigIter.rol.permisos:
				autorizacionesJson[permisoIter.nombre] = False		
			
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return response
		
		
	if dicParametros.get('operacion') == 'admAtributos':
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		recursoSistema = session.query(Recurso).filter_by(tipo='S').first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		for asigIter in asignacionesSistema:											
			for permisoIter in asigIter.rol.permisos:
				#print 'permisoIter.nombre'
				#print permisoIter.nombre
				autorizacionesJson[permisoIter.nombre] = False		
			
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return response
		
	if dicParametros.get('operacion') == 'admGesProyectos':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		asignacionesGestion = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		for asigIter in asignacionesGestion:											
			for permisoIter in asigIter.rol.permisos:
				autorizacionesJson[permisoIter.nombre] = False		
			
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		print 'respondí con un Responseeeee!!!'
		return response
		
		
	if dicParametros.get('operacion') == 'tabItems':
		
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		faseID = request.params['idFase']
		
		#traemos el recurso
		recurso = session.query(Recurso).filter_by( fase_id = faseID, tipo = 'F' ).one()
	
		asignacionesRecurso = session.query(AsignacionRecurso).filter_by( recurso_id = recurso.id, usuario_id = usuarioLogeado.id ).all()
		
		#construimos el JSON que enviaremos
		respuesta = False
		done = False
		for asignacion in asignacionesRecurso:
			if done == True:
				break
			rolAsigncion = asignacion.rol											
			for permisoIter in rolAsigncion.permisos:
				#autorizacionesJson[permisoIter.nombre] = False		
				if permisoIter.nombre == 'VER_ITEM':
					respuesta = True
					done = True
					break
				
		response = Response()
		response.body = json.dumps(dict(success = True, respuesta = respuesta))
		response.content_type = 'application/json'
		return response	
		
	if dicParametros.get('operacion') == 'gestionarFase':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		idProyecto = request.params['idProyecto']
		recursoProyecto = session.query(Recurso).filter_by(proyecto_id = idProyecto).first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(recurso_id = recursoProyecto.id,usuario_id = usuarioLogeado.id).all()
		proyecto = session.query(Proyecto).filter_by( id = idProyecto).one()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		if proyecto.estado == 'ACTIVO' or proyecto.estado == 'PENDIENTE': 
			for asigIter in asignacionesSistema:											
				for permisoIter in asigIter.rol.permisos:
					autorizacionesJson[permisoIter.nombre] = False		
			
				
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		return response
		
	if dicParametros.get('operacion') == 'tabFases':
				
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		idProyecto = request.params['idProyecto']
		recursoProyecto = session.query(Recurso).filter_by(proyecto_id = idProyecto).first()
		asignacionesProyecto = session.query(AsignacionRecurso).filter_by(recurso_id = recursoProyecto.id, usuario_id = usuarioLogeado.id).all()
	
		respuesta = False
		done = False
		#rolesUsuario = usuarioLogeado.roles
		for asigProy in asignacionesProyecto:
			if done:
				break
			for permiso in asigProy.rol.permisos:
				if permiso.nombre == 'VER_FASE':
					respuesta = True
					done = True
					break	
				
		response = Response()
		response.body = json.dumps(dict(success = True, respuesta = respuesta))
		response.content_type = 'application/json'
		return response				
	
	if dicParametros.get('operacion') == 'gestionarTipoItem':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		idProyecto = request.params['idProyecto']
		recursoProyecto = session.query(Recurso).filter_by(proyecto_id = idProyecto).first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(recurso_id = recursoProyecto.id,usuario_id = usuarioLogeado.id).all()

		proyecto = session.query(Proyecto).filter_by( id = idProyecto).one()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		
		if proyecto.estado == 'PENDIENTE' or proyecto.estado == 'ACTIVO': 
			for asigIter in asignacionesSistema:											
				for permisoIter in asigIter.rol.permisos:
					autorizacionesJson[permisoIter.nombre] = False		
			
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		return response
	
	if dicParametros.get('operacion') == 'tabTipoItems':
		
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		asignacionesProyecto = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()
	
		respuesta = False
		done = False
		#rolesUsuario = usuarioLogeado.roles
		for asigProy in asignacionesProyecto:
			if done:
				break
			for permiso in asigProy.rol.permisos:
				if permiso.nombre == 'VER_TIPO_ITEM':
					respuesta = True
					done = True
					break	
			
		response = Response()
		response.body = json.dumps(dict(success = True, respuesta = respuesta))
		response.content_type = 'application/json'
		return response
	
	if dicParametros.get('operacion') == 'gestionarMiembro':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		idProyecto = request.params['idProyecto']
		recursoProyecto = session.query(Recurso).filter_by(proyecto_id = idProyecto).first()
		asignacionesSistema = session.query(AsignacionRecurso).filter_by(recurso_id = recursoProyecto.id,usuario_id = usuarioLogeado.id).all()

		proyecto = session.query(Proyecto).filter_by( id = idProyecto).one()

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		if proyecto.estado == 'PENDIENTE' or proyecto.estado == 'ACTIVO':
			for asigIter in asignacionesSistema:											
				for permisoIter in asigIter.rol.permisos:
					autorizacionesJson[permisoIter.nombre] = False		
				
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		return response	
	
	if dicParametros.get('operacion') == 'tabMiembros':
		
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		asignacionesProyecto = session.query(AsignacionRecurso).filter_by(usuario_id = usuarioLogeado.id).all()
	
		respuesta = False
		done = False
		#rolesUsuario = usuarioLogeado.roles
		for asigProy in asignacionesProyecto:
			if done:
				break
			for permiso in asigProy.rol.permisos:
				if permiso.nombre == 'VER_MIEMBRO':
					respuesta = True
					done = True
					break	
			
		response = Response()
		response.body = json.dumps(dict(success = True, respuesta = respuesta))
		response.content_type = 'application/json'
		return response
		
	if dicParametros.get('operacion') == 'tabLineasBase':
		
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		idFase = request.params['idFase']
		recursoFase = session.query(Recurso).filter_by(fase_id = idFase).first()
		asignacionesFase = session.query(AsignacionRecurso).filter_by(recurso_id = recursoFase.id, usuario_id = usuarioLogeado.id).all()
	
		respuesta = False
		done = False
		#rolesUsuario = usuarioLogeado.roles
		for asigFase in asignacionesFase:
			if done:
				break
			for permiso in asigFase.rol.permisos:
				if permiso.nombre == 'VER_LINEA_BASE':
					respuesta = True
					done = True
					break	
				
		response = Response()
		response.body = json.dumps(dict(success = True, respuesta = respuesta))
		response.content_type = 'application/json'
		return response	
	
	if dicParametros.get('operacion') == 'gestionarLineasBase':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		idFase = request.params['idFase']
		recursoFase = session.query(Recurso).filter_by(fase_id = idFase).first()
		asignacionesFase = session.query(AsignacionRecurso).filter_by(recurso_id = recursoFase.id,usuario_id = usuarioLogeado.id).all()

		fase = session.query(Fase).filter_by( id = idFase).one()
		proyecto = session.query(Proyecto).filter_by( id = fase.proyecto_id).one()
		

		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		if proyecto.estado == 'ACTIVO': 
			for asigIter in asignacionesFase:											
				for permisoIter in asigIter.rol.permisos:
					autorizacionesJson[permisoIter.nombre] = False		
		elif proyecto.estado == 'FINALIZADO':
			autorizacionesJson['VER_ITEM_LINEA_BASE'] = False 
			
		response = Response()
		
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		return response	
	
	if dicParametros.get('operacion') == 'tabRelaciones':	
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		faseID = request.params['idFase']
		
		#traemos el recurso
		recurso = session.query(Recurso).filter_by( fase_id = faseID, tipo = 'F' ).first()
		asignacionesRecurso = []
		if recurso is not None:
			asignacionesRecurso = session.query(AsignacionRecurso).filter_by( recurso_id = recurso.id, usuario_id = usuarioLogeado.id ).all()
		
		#construimos el JSON que enviaremos
		respuesta = False
		done = False
		for asignacion in asignacionesRecurso:
			if done == True:
				break
			rolAsigncion = asignacion.rol											
			for permisoIter in rolAsigncion.permisos:
				#autorizacionesJson[permisoIter.nombre] = False		
				if permisoIter.nombre == 'VER_RELACION':
					respuesta = True
					done = True
					break
				
		response = Response()
		response.body = json.dumps(dict(success = True, respuesta = respuesta))
		response.content_type = 'application/json'
		return response
	
	if dicParametros.get('operacion') == 'relaciones':
		
		#traemos todos los permisos del dominio ADM_USUARIOS que posee el usuario
		usuarioLogeado = session.query(Usuario).filter_by( username = authenticated_userid(request) ).first()
		#rolesUsuarioLogeado = usuarioLogeado.roles
		faseID = request.params['idFase']
		fase = session.query(Fase).filter_by( id = faseID).one()
		proyecto = session.query(Proyecto).filter_by( id = fase.proyecto_id).one()
		#traemos el recurso
		recurso = session.query(Recurso).filter_by( fase_id = faseID, tipo = 'F' ).one()
		

		asignacionesRecurso = session.query(AsignacionRecurso).filter_by( recurso_id = recurso.id, usuario_id = usuarioLogeado.id ).all()
	
		
		#construimos el JSON que enviaremos
		autorizacionesJson = {}
		if proyecto.estado == 'ACTIVO':
			for asignacion in asignacionesRecurso:
				rolAsigncion = asignacion.rol											
				for permisoIter in rolAsigncion.permisos:
					autorizacionesJson[permisoIter.nombre] = False					
		
		
		response = Response()
		#responseView.body = json.dumps(dict(success = True, items = [{ 'nombreItem': 'Caso de Uso de Login', 'nombreFase':'Análisis'}, { 'nombreItem': 'Caso de Uso de Logout', 'nombreFase':'Análisis'}, { 'nombreItem': 'Login.java', 'nombreFase':'Implementación'}]))
		response.body = json.dumps(dict(success = True, autorizacionesJson = autorizacionesJson))
		response.content_type = 'application/json'
		return response	
